<?php
/**===========================================================================
* 작성자	: 하성수
* 용도		: ActionClass 사용시 Database의 연결 및 자료의 사용을 용이하게 해준다.
* 주의		: Controller 클래스의 getControllerInstance() 메소드를 이용하여 사용자의 비즈니스로직(Model) 클래스에 포함하여 사용할 수 있다.
* 연락처	: spacer.ha@gmail.com
 * 사용제한 : 
	- 이 클래스 라이브러리 사용은 무료이나, 원작자의 정보나 주석을 삭제할 수 없습니다.
	- 원작자가 배포한 그대로 수정되지 않은 소스는 자유롭게 배포가 가능합니다.
	- 사용자환경에 맞게 소스를 수정하여 사용은 가능하나 수정된 소스나, 수정된 소스가 포함된 프로그램을 타인에게 제공할 수 없습니다.
	- 영리/비영리/개인/기업 관계없이 모두 사용할 수 있습니다.
============================================================================*/
class Dao {

	var $daoPath		= '../Spac/controller/Dao';

	var $dbConfig		= null;
	var $tables			= null;
	var $siteConfig 	= null;

	var $Conn			= null;
	var $query			= '';
	var $result			= null;
	var $transaction 	= true;
	
	var $stmt			= null;
	var $sqlParamNameArray = array();

	var $logFileName	= '';
	var $logFileContent	= '';

	function Dao() {}

	function initDao() {
		$conf_db				= parse_ini_file($this->daoPath."/Dao.ini");
		$conf_table				= parse_ini_file($this->daoPath."/DaoTables.ini");
		$this->dbConfig			= (object)$conf_db;
		$this->tables			= (object)$conf_table;
	}
	function Connect() {
		$this->initDao();
		$connectionInfo			= parse_ini_file($this->daoPath."/DaoConnection.ini");
		$this->Conn				= mysql_connect($connectionInfo['host'], $connectionInfo['user'], $connectionInfo['passwd']) or exit('DB Connect Error');
		mysql_select_db($connectionInfo['database'], $this->Conn) or exit('DB Select Error');
		unset($connectionInfo);
		if($this->transaction == true) {
			$this->Start();
		}
        register_shutdown_function(array(&$this, 'Close'));        
		$this->executeQuery("SET NAMES utf8");		
	}
	function Start() {
		$this->executeQuery("START TRANSACTION");
	}
	function Close() {		
		if($this->transaction == true) {
			$this->Commit();
		}
		@mysql_close($this->Conn);
	}
	function CloseError() {		
		if($this->transaction == true) {
			$this->RollBack();
			echo "DB Close Error, All Transaction Was Rollback...";
		}
	}
	function Commit() {
		if($this->transaction == true) {
			$this->executeQuery("COMMIT");
		}
	}
	function RollBack() {
		if($this->transaction == true) {
			$result = mysql_query("ROLLBACK",$this->Conn);
			if(!$result) echo "롤백실패";
		}
	}	
	function Roll() {
		$this->RollBack();	
	}	
	function executeQuery($query) {
		$this->query	= $query;
		$this->result	= mysql_query($this->query,$this->Conn);
		$this->writeLogQuery();
		if(!$this->result) {
			$this->QueryError();
			exit;
		} else {
			return $this->result;
		}
	}
	function getFetchObject() {
		return mysql_fetch_object($this->result);
	}
	function getFetchArray() {
		return mysql_fetch_array($this->result);
	}
	function getFetchRow() {
		return mysql_fetch_row($this->result);
	}
	function getNumRows() {
		return mysql_num_rows($this->result);
	}
	function getResult($row_num=0,$col_num=0) {
		return @mysql_result($this->result,$row_num,$col_num);
	}
	function getLastInsertID() {
		$this->executeQuery("SELECT LAST_INSERT_ID()");
		return $this->getResult();				
	}
	function free() {
		return mysql_free_result($this->result);
	}
	function prepareStatement($query) {
		$this->query = $query;
		$this->stmt 	= 'spac_stmt';
		$query 			= "PREPARE ".$this->stmt." FROM \"".$this->query."\";";
		$this->executeQuery($query);		
	}	
	function setParam($param) {		
		$sqlParamName 		= '';
		$this->sqlParamNameArray 	= array();
		$bindQuery 			= '';		
		if(!is_array($param)) {
			$param = array($param);
		}		
		for($i = 0; $i<count($param);$i++) {			
			$sqlParamName 	 			= "@param".$i;			
			if($i == 0) { 
				$bindQuery				= "SET";
			}				
			$bindQuery					.= " " . $sqlParamName . " = '". mysql_real_escape_string($param[$i]) . "'";			
			if($i < (count($param)-1)) {
				$bindQuery				.= ",";	
			} else {
				$bindQuery				.= ";";
			}
			$this->sqlParamNameArray[] 	= $sqlParamName;			
		}
		$this->executeQuery($bindQuery);	 
	}
	function executeStatement() {				
		if(count($this->sqlParamNameArray)) {
			$usingParamString = implode(",",$this->sqlParamNameArray);
		}
		$stmt_query = "EXECUTE " . $this->stmt ." USING ".$usingParamString.";";
		$this->executeQuery($stmt_query);
	}
	function closeStatement() {		
		$deallocate_query = "DEALLOCATE PREPARE " . $this->stmt .";";
		$this->executeQuery($deallocate_query);
	}
	function executeBindingQuery($query,$param,$auto_close = false) {
		$this->prepareStatement($query);
		$this->setParam($param);
		$this->executeStatement();
		if($auto_close == true) {
			$this->closeStatement();
		}
	}
	function closeBindingQuery() {
		$this->closeStatement();
	}
	function View_Query() {
		echo "
			<script>
				function ViewQuery() {
					obj = document.getElementById('query_area');
					if(obj.style.display == 'none') {
						obj.style.display = 'block';
					} else {
						obj.style.display = 'none';
					}
				}
			</script>
			<div><a href='#' onClick='ViewQuery()' title='쿼리문보기'>[View Query]</a></div>
			<div id='query_area' style='display:none;background-color:#f2f2f2;padding:3px;color:blue';width:100%;height:auto;'><pre>" . $this->query . "
			</pre></div>
		";
	}
	function QueryError() {		
		$this->RollBack();
		if($this->dbConfig->viewQueryError == true) {
			echo "
				<html>
				<head><title>DB Query Error Msg</title>
				<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
				</head>
				<body>
				<div style='background-color:#FFFFCC;padding:5px;width:auto;color:blue;font-size:12px;'>
					<B>[쿼리문에러]</B>
				</div>
			";
			$this->View_Query();
			echo "
				</body>
				</html>
			";
		} else {
			if($this->dbConfig->error_page) {
				echo "<meta http-equiv=\"Refresh\" content=\"0; url=" . $this->dbConfig->error_page . "\">";
			} else {
				$this->viewPublicErrorMsg();	
			}
			exit;			
		}
	}
	function viewPublicErrorMsg() {
		echo "
			<html>
			<head><title>Error Page</title>
			<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
			</head>
			<body>
			<div style='background-color:#FFFFCC;padding:5px;width:auto;color:blue;font-size:12px;'>
				<B>죄송합니다. 데이터베이스관련 에러가 발생했습니다. 다시 시도해 보시고 문제가 계속될 경우 시스템관리자에게 문의하시기 바랍니다.</B>
			</div>
			</body>
			</html>
		";	
	}
	function writeLogQuery() {		
		if($this->dbConfig->dbFileLoging == true) {
			if(!is_dir($this->dbConfig->dbLogFilePath)) {
				umask(0000);
				if(!mkdir($this->dbConfig->dbLogFilePath, 0707)) {
					echo $this->dbConfig->dbLogFilePath."디렉토리생성 실패";
				}
			}
			$this->logFileContent	= '';		
			$this->logFileName		= date("Ymd").'.spac_dao.log';
			$this->logFileContent	.= "[query]:".$this->query;
			$this->logFileContent = iconv( "UTF-8", "EUC-KR",$this->logFileContent);
			if(!file_exists($this->dbConfig->dbLogFilePath.'/'.$this->logFileName)) {
				$fp = fopen($this->dbConfig->dbLogFilePath.'/'.$this->logFileName,"w");
			} else {
				$fp = fopen($this->dbConfig->dbLogFilePath.'/'.$this->logFileName,"a");
			}
			flock( $fp, LOCK_EX );
			fwrite($fp,"#".date("Y-m-d H:i:s")."------------------------------------\n");
			fwrite($fp,$this->logFileContent);
			fwrite($fp,"\n\n\n");
			flock( $fp, LOCK_UN );
			fclose($fp);
		}
	}
} 
?>